﻿#region << 版 本 注 释 >>

/*----------------------------------------------------------------
* 类 名 称 ：IStateMachine
* 类 描 述 ：
* 作    者 ：henrychang
* 创建时间 ：2019/1/27 23:43:20
*******************************************************************
* Copyright @ henrychang 2019. All rights reserved.
*******************************************************************
//----------------------------------------------------------------*/

#endregion << 版 本 注 释 >>

using System;
using System.Collections.Generic;

namespace TouchFish.StateMachine
{
    public interface IStateMachine<T> where T : class
    {
        /// <summary>
        /// 获取状态机名称
        /// </summary>
        string Name
        {
            get;
        }

        /// <summary>
        /// 获取状态机持有者
        /// </summary>
        T Owner
        {
            get;
        }

        /// <summary>
        /// 获取状态机中状态的数量
        /// </summary>
        int StateCount
        {
            get;
        }

        /// <summary>
        /// 获取状态机是否正在运行
        /// </summary>
        bool IsRunning
        {
            get;
        }

        /// <summary>
        /// 获取状态机是否被销毁
        /// </summary>
        bool IsDestroyed
        {
            get;
        }

        /// <summary>
        /// 获取当前状态机状态
        /// </summary>
        State<T> CurrentState
        {
            get;
        }

        /// <summary>
        /// 开始状态机
        /// </summary>
        /// <typeparam name="TState">要开始的状态机状态类型</typeparam>
        void Start<TState>() where TState : State<T>;

        /// <summary>
        /// 开始状态机
        /// </summary>
        /// <param name="stateType">要开始的状态机状态类型</param>
        void Start(Type stateType);

        /// <summary>
        /// 是否存在状态机状态
        /// </summary>
        /// <typeparam name="TState">要检查的状态机状态类型</typeparam>
        /// <returns>是否存在有限状态机状态。</returns>
        bool HasState<TState>() where TState : State<T>;

        /// <summary>
        /// 是否存在状态机状态
        /// </summary>
        /// <param name="stateType">要检查的状态机状态类型</param>
        /// <returns>是否存在有限状态机状态。</returns>
        bool HasState(Type stateType);

        /// <summary>
        /// 获取状态机状态
        /// </summary>
        /// <typeparam name="TState">要获取的状态机状态类型</typeparam>
        /// <returns>要获取的状态机状态</returns>
        TState GetState<TState>() where TState : State<T>;

        /// <summary>
        /// 获取状态机状态
        /// </summary>
        /// <param name="stateType">要获取的状态机状态类型</param>
        /// <returns>要获取的状态机状态</returns>
        State<T> GetState(Type stateType);

        /// <summary>
        /// 获取状态机的所有状态
        /// </summary>
        /// <returns>状态机的所有状态</returns>
        State<T>[] GetAllStates();

        /// <summary>
        /// 获取状态机的所有状态
        /// </summary>
        /// <param name="results">状态机的所有状态</param>
        void GetAllStates(List<State<T>> results);

        /// <summary>
        /// 抛出状态机事件
        /// </summary>
        /// <param name="eventId">事件编号</param>
        /// <param name="param">事件参数</param>
        void FireEvent(int eventId, params object[] param);
    }
}